package com.gkzf.ai.framework.common.util.date;

import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Pattern;
/**
 * 通用日期时间转换器
 * 使用正则表达式识别格式，然后使用 java.time 进行解析和格式化。
 * 目标格式: yyyy-MM-dd HH:mm:ss
 */
@Slf4j
public class UniversalDateTimeConverter {

    // 1. 定义最终的目标格式化器
    private static final DateTimeFormatter TARGET_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    // 2. 创建一个有序的Map，存储<正则表达式, 日期格式化模式>
    // 使用 LinkedHashMap 保证了匹配的顺序，应该将更具体的格式放在前面
    private static final Map<Pattern, String> FORMAT_PATTERNS = new LinkedHashMap<>();

    static {
        // --- 初始化支持的格式 ---

        // 格式 1: yyyy-MM-dd HH:mm:ss (标准格式)
        FORMAT_PATTERNS.put(Pattern.compile("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"), "yyyy-MM-dd HH:mm:ss");

        // 格式 2: yyyy/MM/dd HH:mm:ss
        FORMAT_PATTERNS.put(Pattern.compile("^\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}$"), "yyyy/MM/dd HH:mm:ss");

        // 格式 3: yyyy-MM-dd'T'HH:mm:ss (ISO 8601)
        FORMAT_PATTERNS.put(Pattern.compile("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$"), "yyyy-MM-dd'T'HH:mm:ss");

        // 格式 4: yyyy-MM-dd HH:mm (缺少秒)
        FORMAT_PATTERNS.put(Pattern.compile("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$"), "yyyy-MM-dd HH:mm");

        // 格式 5: yyyyMMddHHmmss (无分隔符)
        FORMAT_PATTERNS.put(Pattern.compile("^\\d{14}$"), "yyyyMMddHHmmss");

        // 格式 6: yyyy年MM月dd日 HH时mm分ss秒 (中文格式)
        FORMAT_PATTERNS.put(Pattern.compile("^\\d{4}年\\d{2}月\\d{2}日 \\d{2}时\\d{2}分\\d{2}秒$"), "yyyy年MM月dd日 HH时mm分ss秒");

        // 格式 7: yyyy-MM-dd HH:mm:ss.S (带毫秒) - 我们会截断毫秒
        FORMAT_PATTERNS.put(Pattern.compile("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{1,3}$"), "yyyy-MM-dd HH:mm:ss.S");

        // 格式 8: yyyyMMdd HH:mm:ss (日期部分无分隔符)
        FORMAT_PATTERNS.put(Pattern.compile("^\\d{8} \\d{2}:\\d{2}:\\d{2}$"), "yyyyMMdd HH:mm:ss");
    }

    /**
     * 将各种格式的日期时间字符串转换为 "yyyy-MM-dd HH:mm:ss" 格式。
     *
     * @param dateTimeString 待转换的日期时间字符串
     * @return 转换后的标准格式字符串
     * @throws IllegalArgumentException 如果字符串格式不被支持或无法解析
     */
    public static String convert(String dateTimeString) {
        if (dateTimeString == null || dateTimeString.trim().isEmpty()) {
            throw new IllegalArgumentException("Input date-time string cannot be null or empty.");
        }

        // 3. 遍历所有支持的格式，进行匹配和转换
        for (Map.Entry<Pattern, String> entry : FORMAT_PATTERNS.entrySet()) {
            Pattern regex = entry.getKey();
            String formatPattern = entry.getValue();

            if (regex.matcher(dateTimeString).matches()) {
                try {
                    // 匹配成功，使用对应的格式化模式进行解析
                    DateTimeFormatter sourceFormatter = DateTimeFormatter.ofPattern(formatPattern);
                    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, sourceFormatter);

                    // 使用目标格式化器进行格式化并返回
                    return dateTime.format(TARGET_FORMATTER);
                } catch (DateTimeParseException e) {
                    // 即使正则匹配，也可能出现无效日期（如2月30日），继续尝试下一种可能
                }
            }
        }

        // 4. 如果所有格式都匹配失败，则抛出异常
        throw new IllegalArgumentException("Unsupported or invalid date-time format: \"" + dateTimeString + "\"");
    }

    /**
     * 主方法，用于演示和测试
     */
    public static void main(String[] args) {
        String[] testCases = {
                "2023-10-27 15:45:30",
                "2023/10/27 09:05:01",
                "2023-11-01T23:59:59",
                "2024-02-29 12:00",      // 缺少秒
                "20231231183000",      // 无分隔符
                "20250707 11:21:11",
                "2023年10月27日 15时45分30秒"
        };


        for (String testCase : testCases) {
            try {
                String convert = convert(testCase);
                log.info("原始: {} -> 转换后: {}",testCase , convert);
            } catch (IllegalArgumentException e) {
                log.error("原始: {} -> 转换后: {}", testCase , e.getMessage());
            }
        }

    }
}
